package com.gnerv.sylvanas.business.manage.storage;

import com.gnerv.sylvanas.business.manage.model.dto.AccountDTO;
import com.gnerv.sylvanas.business.manage.model.dto.AccountDetailsDTO;
import com.gnerv.sylvanas.business.manage.model.dto.AuthAccountDTO;
import com.gnerv.sylvanas.business.manage.model.entity.Account;
import com.gnerv.sylvanas.business.manage.repository.mapper.AccountMapper;
import com.gnerv.sylvanas.business.manage.repository.mapper.OrgAccountMapper;
import com.gnerv.sylvanas.business.manage.repository.mapper.RoleAccountMapper;
import lombok.AllArgsConstructor;
import lombok.NonNull;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Set;

/**
 * @author Gnerv LiGen
 */
@Service
@AllArgsConstructor
public class AccountStorageService {

    private final AccountMapper accountMapper;
    private final OrgAccountMapper orgAccountMapper;
    private final RoleAccountMapper roleAccountMapper;

    
    public int insert(Account account) {
        return accountMapper.insert(account);
    }

    
    public int deleteByUkId(String ukId) {
        return accountMapper.deleteByUkId(ukId);
    }

    
    public int deleteBatchByUkIds(List<String> ukIds) {
        return accountMapper.deleteBatchByUkIds(ukIds);
    }

    
    public int updateByUkId(Account account) {
        return accountMapper.updateByUkId(account);
    }

    
    public AccountDTO selectByUkId(String ukId) {
        return accountMapper.selectByUkId(ukId);
    }

    
    public AccountDetailsDTO selectDetailsByUkId(String ukId) {
        return accountMapper.selectDetailsByUkId(ukId);
    }

    
    public AccountDTO selectByUsername(String username) {
        return accountMapper.selectByUsername(username);
    }

    
    public AccountDetailsDTO selectDetailsByUsername(String username) {
        return accountMapper.selectDetailsByUsername(username);
    }

    public AuthAccountDTO selectAuthAccountByUsername(String username) {
        return accountMapper.selectAuthAccountByUsername(username);
    }

    
    public List<AccountDTO> selectListByUsername(String username, int limitStart, int limitSize) {
        return accountMapper.selectListByUsername(username, limitStart, limitSize);
    }

    
    public List<AccountDTO> selectListByRoleUkId(String roleUkId) {
        return accountMapper.selectListByRoleUkId(roleUkId);
    }

    
    public List<AccountDTO> selectListByOrgUkId(String orgUkId) {
        return accountMapper.selectListByOrgUkId(orgUkId);
    }

    
    public int selectCountByUsername(String username) {
        return accountMapper.selectCountByUsername(username);
    }

    
    public Set<String> selectListUkIdByRoleUkIdAndOrgUkId(Set<String> roleUkIdList, Set<String> orgUkIdList) {
        return accountMapper.selectListUkIdByRoleUkIdAndOrgUkId(roleUkIdList, orgUkIdList);
    }

    
    public Set<String> selectListUsernameByRoleUkIdAndOrgUkId(Set<String> roleUkIdList, Set<String> orgUkIdList) {
        return accountMapper.selectListUsernameByRoleUkIdAndOrgUkId(roleUkIdList, orgUkIdList);
    }

    
    public int bindRole(@NonNull String accountUkId, @NonNull Set<String> roleUkIdList, String creator) {
        return roleAccountMapper.insertAccountRole(accountUkId, roleUkIdList, creator);
    }

    
    public int unbindRole(@NonNull String accountUkId) {
        return roleAccountMapper.deleteByAccountUkId(accountUkId);
    }

    
    public int bindOrg(String accountUkId, String orgUkId, @NonNull String creator) {
        return orgAccountMapper.insertAccountOrg(accountUkId, orgUkId, creator);
    }

    
    public int unbindOrg(@NonNull String accountUkId) {
        return orgAccountMapper.deleteByAccountUkId(accountUkId);
    }

    
    public List<AccountDetailsDTO> selectListDetailsByOrgUkId(String orgUkId) {
        return accountMapper.selectListDetailsByOrgUkId(orgUkId);
    }

    
    public List<AccountDetailsDTO> selectListDetailsByUsername(String username, int limitStart, int limitSize) {
        return accountMapper.selectListDetailsByUsername(username, limitStart, limitSize);
    }
}
